package com.cskaoyan.aspect;

import com.cskaoyan.util.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;

/**
 *
 * 散列密码切面
 *
 */
@Aspect
@Component
public class HashPasswordAspect {
    //切点
    @Pointcut("@annotation(com.cskaoyan.anno.HashPasswordAnno)")
    public void hashPasswordPointCut() {
    }

    /**HJL
     * 在执行Handler方法之前，检查参数中名为password的属性，并散列
     * 在需要散列密码的Handler方法上加 注解 @HashPasswordAnno 即可
     * 散列方法位于util.StringUtils.sha250(string raw)
     * 可以按需要修改散列方法的内部实现
     * @param joinPoint
     */
    @Before("hashPasswordPointCut()")
    public void hashPasswordBeforeController(JoinPoint joinPoint) {
        //获得方法参数
        Object[] args = joinPoint.getArgs();
        //检查password（如果有的话）属性并散列
        try {
            for (Object arg : args) {
                Class<?> aClass = arg.getClass();
                Field passwordField = aClass.getDeclaredField("password");
                if (passwordField != null) {
                    passwordField.setAccessible(true);
                    String rawPassword = (String) passwordField.get(arg);
                    String hashPassword = StringUtils.sha250(rawPassword);
                    passwordField.set(arg, hashPassword);
                    break;
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }

}
